package top.xchch.tool.mockito.juejin;

import org.junit.Test;

import java.util.LinkedList;
import java.util.List;

import static org.mockito.Mockito.*;

/**
 * spy是创建一个拷贝，如果你保留原始的list，并用它来进行操作，那么spy并不能检测到其交互
 * spy一个真正的对象+试图stub一个final方法，这样是会有问题的
 *
 * @author sai.zhang
 * @date 2021-08-31 15:03
 */
public class SpyTest12 {
    @Test
    public void testSpy() throws Exception {
        List list = new LinkedList();
        List spy = spy(list);

        //可选的，你可以stub某些方法
        when(spy.size()).thenReturn(100);

        //调用"真正"的方法
        spy.add("one");
        spy.add("two");

        //打印one
        System.out.println(spy.get(0));

        //size()方法被stub了，打印100
        System.out.println(spy.size());

        //可选，验证spy对象的行为
        verify(spy).add("one");
        verify(spy).add("two");

        //下面写法有问题，spy.get(10)会抛IndexOutOfBoundsException异常
        when(spy.get(10)).thenReturn("foo");
        //可用以下方式
        doReturn("foo").when(spy).get(10);
    }

}
